package beans;

import pool.*;
import java.util.*;
import java.sql.*;


/**
 * @author Antonin Mozzati
 * @author Yannick Schürter
 */
public class ListeTagFlux {

    private ArrayList<TagFluxBean> listeTagFlux;
    JDCConnectionDriver driver;
    Connection connexion;

    public ListeTagFlux(JDCConnectionDriver driver) throws Exception {
	this.driver = driver;
    }

    // Retourne la liste des tags de flux actuellement dans la base
    public ArrayList<TagFluxBean> getListeTagFlux() {
	PreparedStatement ps;
	listeTagFlux = new ArrayList<TagFluxBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT * FROM app.tags_flux");
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		TagFluxBean tag = new TagFluxBean(
			new Integer(rs.getString(1)),
			rs.getString(2));
		listeTagFlux.add(tag);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeTagFlux;
    }

    public int addTagFlux(TagFluxBean tf, FluxBean fb) {
        try {
            this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
            PreparedStatement ps;
            int insertID;
            // Si aucun tag portant le même nom n'existe, on le crée
            if (!this.contains(tf)) {
                System.out.println("Ajout du tag " + tf.getNomTagFlux());
                // Insertion du tag en lui-même dans la table des tags
                ps = connexion.prepareStatement("Insert into app.tags_flux (nomTagFlux) VALUES ("
                        + "'" + tf.getNomTagFlux().replace("'","''") + "')", Statement.RETURN_GENERATED_KEYS);
                ps.executeUpdate();

                // Récupération de l'id du tag générée à l'insertion
                ResultSet keys = ps.getGeneratedKeys();
                keys.next();  
                insertID = keys.getInt(1);
                System.out.println("Insert ID du tag : "+insertID);
            // Si un tag portant le même nom existe, on récupère son id
            } else {
                insertID = tf.getId_tagflux();
            }

            // Insertion de l'id du tag et du flux dans la table de jointure
            ps = connexion.prepareStatement("Insert into app.tags_flux_match (id_tagflux, id_flux) VALUES ("
                    + insertID + ", "+fb.getId_flux()+")");
            ps.executeUpdate();
            System.out.println("Tag " + tf.getNomTagFlux() + " ajouté avec succès.");

            ps.close();
            return insertID;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    public void removeTag(int id) {
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    PreparedStatement ps;
	    System.out.println("Suppression du tag d'id " + id);
	    ps = connexion.prepareStatement("DELETE FROM app.tags_flux WHERE ID_TAGFLUX=" + id);
	    ps.executeUpdate();
	    System.out.println("Tag " + id + " retiré avec succès.");
	    ps.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public ArrayList<TagFluxBean> getByFlux(int id_flux) {
	PreparedStatement ps;
	listeTagFlux = new ArrayList<TagFluxBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT app.tags_flux.* FROM app.tags_flux, app.tags_flux_match"
                    + " WHERE app.tags_flux.id_tagflux = app.tags_flux_match.id_tagflux"
                    + " AND app.tags_flux_match.id_flux="+id_flux);
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		TagFluxBean tag = new TagFluxBean(
			new Integer(rs.getString(1)),
			rs.getString(2));
		listeTagFlux.add(tag);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeTagFlux;
    }
    
    public boolean contains(TagFluxBean tb) {
        for(TagFluxBean tf : this.getListeTagFlux()) {
            if (tf.getNomTagFlux().equals(tb.getNomTagFlux())) {
                tb.setId_tagflux(tf.getId_tagflux());
                return true;
            }
        }
        return false;
    }
}
